package com.itheima.proxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author ：sean
 * @date ：Created in 2022/3/16
 * @description ：
 * @version: 1.0
 */
public class ServiceJDKProxy {
	// 被代理的对象
	public static Object getServiceProxy(Object target){
		System.out.println("target:"+target.getClass());
		InvocationHandler invocationHandler = new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// 是目标对象，所有的方法在执行的时候，都调用
				// UserServiceImpl userService = new UserServiceImpl();
				// userService.delete findAll update save().....
				// 切记：所有方法都被代理 proxy是代理类产生的对象，一般不需要操作
				System.out.println(" invoke:代理类对象开始 代理类:"+proxy.getClass());
				long startTime = System.currentTimeMillis();

				// target原始对象，是被代理的对象，具体执行业务需要它来执行
				System.out.println(" method:"+method.getName());
				// 这个是update delete find save 肯定不是代理干的呀，下面就是我们原始对象干的
				// args这个是方法的参数
				// 对此参数做校验，做日志
				// 执行我们目标对象自己的业务
				Object invokeReturn = method.invoke(target, args);

				long endTime = System.currentTimeMillis();
				System.out.println(" 耗时:"+(endTime-startTime));
				System.out.println(" invoke:代理类对象结束");
				return invokeReturn;
			}
		};
		// UserServiceImpl userService = new UserServiceImpl();
		// JDK动态代理，知道了UserService接口了
		// invocationHandler代理类在执行方法时做的事情
		return Proxy.newProxyInstance(
			target.getClass().getClassLoader(),
			target.getClass().getInterfaces(), invocationHandler);
	}
}
